package com.rectcircle.scalatrateset.controller

import org.json4s.{DefaultFormats, Formats}
import org.scalatra.json.{JacksonJsonSupport, NativeJsonSupport}

// Swagger support
import org.scalatra.swagger._

/**
  * @author Rectcircle
  *         createTime 2017/1/13
  */

//class FlowersController(implicit val swagger: Swagger) extends ScalatraServlet
//  with NativeJsonSupport with SwaggerSupport {

class FlowersController(implicit val swagger: Swagger)  extends ScalatratestStack with JacksonJsonSupport with SwaggerSupport{
	
	//应用api配置
	protected val applicationDescription = "flowershop API。它暴露了用于浏览和搜索花的列表以及检索单花的操作。"
	
	
	//设置自动case类到JSON输出序列化，需要JValueResult trait。
	protected implicit lazy val jsonFormats: Formats = DefaultFormats
	
	// 在每个操作运行之前，将内容类型设置为JSON格式。
	before() {
		contentType = formats("json")
	}
	

	
	val getFlowers =
		(apiOperation[List[Flower]]("getFlowers")
		  summary "展示所有花"
		  notes "显示花店里的所有花。您也可以搜索它。"
		  parameter queryParam[Option[String]]("name").description("通过中文名字搜索"))
	
	/*
	* 检索花的列表
	*/
	get("/", operation(getFlowers)) {
		params.get("name") match {
			case Some(name) => FlowerData.all filter (_.name.toLowerCase contains name.toLowerCase)
			case None => FlowerData.all
		}
	}
	
	val findBySlug =
		(apiOperation[Flower]("findBySlug")
		  summary "精确查找"
		  parameters (
		  pathParam[String]("slug").description("需要被提取的花的键值")
		  ))
	
	get("/:slug", operation(findBySlug)) {
		FlowerData.all find (_.slug == params("slug")) match {
			case Some(b) => b
			case None => halt(404)
		}
	}
	
}

// 一个Flower对象用作测试的数据模型

case class Flower(slug: String, name: String)

// 一个测试数据源
object FlowerData {
	
	/**
	  * 一些假的花数据，我们可以模拟反演。
	  */
	var all = List(
		Flower("yellow-tulip", "黄金郁金香"),
		Flower("red-rose", "红玫瑰"),
		Flower("black-rose", "黑玫瑰"))
}
